home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
PROGRAM
/
DJGOS106.ARJ
/
GRAPHICS.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-13
|
4KB
|
181 lines
/* This is file GRAPHICS.C */
/*
** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
**
** This file is distributed under the terms listed in the document
** "copying.dj", available from DJ Delorie at the address above.
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#pragma inline
/* History:42,23 */
#include <dos.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "build.h"
#include "types.h"
#include "paging.h"
#include "graphics.h"
#include "tss.h"
#include "gdt.h"
int gr_def_tw = 0;
int gr_def_th = 0;
int gr_def_gw = 0;
int gr_def_gh = 0;
far (*gr_init_func)();
unsigned gr_paging_offset;
unsigned gr_paging_segment;
word32 gr_paging_func;
#ifdef NONEWDRIVER
typedef struct {
word16 init_routine;
word16 paging_routine;
word16 split_rw;
word16 def_tw;
word16 def_th;
word16 def_gw;
word16 def_gh;
} GR_DRIVER;
#else
#include <stdio.h>
#include "driver.h"
int gr_def_numcolor = 0;
static char new_driver = 0;
#define init_routine old.modeset_routine
#define paging_routine old.paging_routine
#define split_rw old.driver_flags
#define def_tw old.def_tw
#define def_th old.def_th
#define def_gw old.def_gw
#define def_gh old.def_gh
#endif
extern GR_DRIVER builtin_gr_driver;
GR_DRIVER *gr_driver;
void setup_graphics_driver(char *drv_name)
{
int file;
struct stat sbuf;
if ((drv_name == NULL) || stat(drv_name, &sbuf))
{
gr_driver = &builtin_gr_driver;
}
else
{
gr_driver = (GR_DRIVER *)malloc(sbuf.st_size + 16);
if (gr_driver == 0)
{
gr_driver = &builtin_gr_driver;
}
else
{
gr_driver = (GR_DRIVER *)(((unsigned)gr_driver + 15) & ~15);
file = open(drv_name, O_RDONLY | O_BINARY);
read(file, gr_driver, sbuf.st_size);
close(file);
}
}
if (gr_driver == &builtin_gr_driver)
{
gr_init_func = MK_FP(_DS, gr_driver->init_routine);
gr_paging_segment = _DS;
gr_paging_offset = gr_driver->paging_routine;
}
else
{
gr_init_func = MK_FP(_DS + (unsigned)gr_driver/16, gr_driver->init_routine);
gr_paging_segment = _DS + (unsigned)gr_driver/16;
gr_paging_offset = gr_driver->paging_routine;
}
gr_paging_func = ((word32)g_grdr << 19) + gr_paging_offset;
if (gr_def_tw) gr_driver->def_tw = gr_def_tw;
if (gr_def_th) gr_driver->def_th = gr_def_th;
if (gr_def_gw) gr_driver->def_gw = gr_def_gw;
if (gr_def_gh) gr_driver->def_gh = gr_def_gh;
#ifndef NONEWDRIVER
if(gr_driver->new.driver_flags & GRD_NEW_DRIVER) {
void far (*init_fun)(void);
new_driver = 1;
if(gr_def_numcolor) gr_driver->new.def_numcolor = gr_def_numcolor;
init_fun = MK_FP(FP_SEG(gr_init_func),gr_driver->new.driver_init_routine);
_AX = FP_SEG(init_fun);
asm push ds;
asm mov ds,ax;
asm call dword ptr ss:[init_fun];
asm pop ds;
if(_AX == 0) {
/* You may want to do something more appropriate here */
fputs("Graphics initialization error -- probably incorrect driver\n",stderr);
/* exit(1); */
}
}
else new_driver = 0;
#endif
}
void graphics_mode(int ax)
{
int bx, cx, dx;
bx = tss_ptr->tss_ebx;
cx = tss_ptr->tss_ecx;
dx = tss_ptr->tss_edx;
_AX = ax;
_BX = bx;
_CX = cx;
_DX = dx;
asm push ds
asm push ds
asm pop es
asm push word ptr gr_init_func+2
asm pop ds
asm call dword ptr es:[gr_init_func]
asm pop ds
dx = _DX;
cx = _CX;
#ifndef NONEWDRIVER
bx = _BX;
if(!new_driver)
#endif
bx = gr_driver->split_rw;
tss_ptr->tss_ebx = bx;
tss_ptr->tss_ecx = cx;
tss_ptr->tss_edx = dx;
}
#ifndef NONEWDRIVER
void graphics_inquiry(void)
{
tss_ptr->tss_ebx = gr_driver->old.driver_flags;
if(new_driver) {
word32 base = 0xe0000000L + ((word32)FP_SEG(gr_init_func) << 4);
tss_ptr->tss_ecx = base + gr_driver->new.text_table;
tss_ptr->tss_edx = base + gr_driver->new.graphics_table;
}
else {
tss_ptr->tss_ecx = 0L;
tss_ptr->tss_edx = 0L;
}
}
#endif